<?php


namespace support\utils;


/**
 * 用于金额计算
 * Class Decimal
 * @package extend\utils
 */
class Decimal
{
    private $value;

    /**
     * @param string $value
     * @return Decimal
     */
    static function newDecimal($value = '0')
    {
        return new Decimal($value);
    }

    public function __construct($value = '0')
    {
        $this->value = $this->normalize($value);
    }

    private function normalize($value)
    {
        return strval(str_replace(',', '', $value));
    }

    public function __toString()
    {
        return $this->value;
    }

    /**
     * 加法
     * @param string|Decimal $operand  数字/字符串或者Decimal对象
     * @param int $scale 小数点
     * @return $this
     */
    public function add($operand, $scale = 2)
    {
        $this->value = bcadd($this->value, $operand, $scale);
        return $this;
    }

    /**
     * 减法
      * @param string|Decimal $operand  数字/字符串或者Decimal对象
     * @param int $scale 小数点
     * @return $this
     */
    public function subtract($operand, $scale = 2)
    {
        $this->value = bcsub($this->value, $operand, $scale);
        return $this;
    }

    /**
     * 乘法
      * @param string|Decimal $operand  数字/字符串或者Decimal对象
     * @param int $scale 小数点
     * @return $this
     */
    public function multiply($operand, $scale = 2)
    {
        $this->value = bcmul($this->value, $operand, $scale);
        return $this;
    }

    /**
     * 除法
      * @param string|Decimal $operand  数字/字符串或者Decimal对象
     * @param int $scale 小数点
     * @return $this
     */
    public function divide($operand, $scale = 2)
    {
        $this->value = bcdiv($this->value, $operand, $scale);
        return $this;
    }

    /**
     * 获取计算后的数据
     */
    public function getValue()
    {
        return $this->value;
    }
}